package config

import (
	"encoding/json"
	"strings"
	"time"

	"gitee.com/xgotool/backend-framework-template/model"
)

// 扩展配置项
type Ext struct {
	RunConf struct {
		RegStatus uint8  `json:"reg_status"` // 注册状态 0-关闭 1-开启
		CityExcel string `json:"city_excel"` // 城市信息Excel文件路径
		P7zPath   string `json:"p7z_path"`   // 7z压缩解压程序路径
		LogPath   string `json:"log_path"`   // 日志文件路径
	} `json:"run_conf"` // 运行配置项
	JWT struct {
		Key        string `json:"key"`         // JWT加密密钥
		Sign       string `json:"sign"`        // JWT签名效验
		KeyExpired int64  `json:"key_expired"` // JWT密钥过期时间 单位：秒
	} `json:"jwt"` // JWT配置项
	Upload struct {
		Path    string `json:"path"`     // 上传路径
		Size    int64  `json:"size"`     // 上传大小限制 单位：B
		IsLogin uint8  `json:"is_login"` // 必须要登录才能上传？ 1-是
		Domain  string `json:"domain"`   // 上传后文件拼接的前缀域名 用于外部代理使用
	} `json:"upload"` // 上传配置项
	SDK struct {
		Account struct {
			Status        uint8  `json:"status"`         // 是否启用账户余额
			Recharge      uint8  `json:"recharge"`       // 允许充值？
			RechargeLevel string `json:"recharge_level"` // 充值档位 每行一个，-:10表示自定义金额,进位为1:10
			Withdraw      uint8  `json:"withdraw"`       // 允许提现？
			WithdrawLevel string `json:"withdraw_level"` // 提现档位 每行一个，-:10表示自定义金额,进位为1:10
		} `json:"account"` // 账户余额配置项
		WechatApp struct {
			Status    uint8  `json:"status"`     // 是否启用微信小程序SDK
			AppId     string `json:"app_id"`     // 微信小程序APPID
			AppSecret string `json:"app_secret"` // 微信小程序密钥
		} `json:"wechat_app"` // 微信小程序SDK配置项
		WechatPay struct {
			Status uint8 `json:"status"` // 是否启用微信SDK
		} `json:"wechat_pay"` // 微信SDK配置项
		Alipay struct {
			Status uint8 `json:"status"` // 是否启用支付宝SDK
		} `json:"alipay"` // 支付宝SDK配置项
	} `json:"sdk"` // SDK配置项
}

var _conf_ext *Ext

// 获取上传文件的地址
//
//	pth	待拼接的URL地址
func GetUploadDomain(pth string) string {
	if pth == "" {
		return ""
	}
	if strings.HasPrefix(pth, "http://") || strings.HasPrefix(pth, "https://") {
		return pth
	}
	if GetExt().Upload.Domain == "" {
		return "/system/configure/file?path=/" + pth
	}
	return GetExt().Upload.Domain + "/" + pth
}

// 获取扩展配置信息
func GetExt() *Ext {
	if _conf_ext == nil {
		// 从数据库中获取扩展配置项
		conn, err := GetConnect()
		if err != nil {
			// 返回空配置项，避免外部报错
			return &Ext{}
		}
		conf := model.Configure{} // 此处为系统配置项，故只获取基础配置即可
		conn.Table(conf.TableName()).Where("uid", 0).Order("id ASC").Limit(1).Find(&conf)
		if conf.Content == "" {
			_conf_ext = &Ext{}
		} else {
			_conf_ext = &Ext{}
			json.Unmarshal([]byte(conf.Content), _conf_ext)
		}
	}
	return _conf_ext
}

// 扩展配置项保存
func (c *Ext) Save() error {
	// 从数据库中获取扩展配置项
	conn, err := GetConnect()
	if err != nil {
		return err
	}
	conf := model.Configure{} // 此处为系统配置项，故只获取基础配置即可
	conn.Table(conf.TableName()).Where("uid", 0).Order("id ASC").Limit(1).Find(&conf)
	conf.UpdatedAt = time.Now().Unix()
	if conf.CreatedAt == 0 {
		conf.CreatedAt = conf.UpdatedAt
	}
	b, _ := json.Marshal(c)
	conf.Content = string(b)
	conn.Table(conf.TableName()).Save(&conf)
	_conf_ext = c // 替换配置项信息
	return nil
}
